﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MubiSDK.LoggingLib.Helper
{
    /// <summary>
    /// 针对日志系统组件提供文件操作相关的工具方法
    /// </summary>
    public class FileHelper
    {
        /// <summary>
        /// 检查指定路径的文件或目录是否存在
        /// </summary>
        /// <param name="path">要检查的路径</param>
        /// <returns>如果路径存在则为 true；如果路径不存在、为 null 或空字符串，或发生异常，则为 false</returns>
        public static bool Exists(string path)
        {
            // 参数验证
            if (string.IsNullOrEmpty(path))
            {
                return false;
            }

            try
            {
                return File.Exists(path) || Directory.Exists(path);
            }
            catch (Exception ex) when (ex is UnauthorizedAccessException ||
                                       ex is PathTooLongException ||
                                       ex is IOException)
            {
                // 捕获可能因路径无效、权限不足等引起的异常
                // 日志组件自身应避免写入日志导致循环，这里可考虑将异常传递给调用方或静默处理返回false
                // 例如，可记录内部诊断信息（如果有一套安全的内诊日志机制）
                System.Diagnostics.Debug.WriteLine($"[FileHelper.Exists] 检查路径时发生异常: {ex.Message}");
                return false;
            }
        }

        /// <summary>
        /// 从完整文件路径中获取其所在的目录路径
        /// </summary>
        /// <param name="filePath">完整的文件路径</param>
        /// <returns>文件所在的目录路径。如果 filePath 为 null/空、是根目录，或无法确定目录，则返回 null</returns>
        public static string GetFileDirectory(string filePath)
        {
            // 参数验证
            if (string.IsNullOrEmpty(filePath))
            {
                return null;
            }

            try
            {
                return Path.GetDirectoryName(filePath);
            }
            catch (Exception ex) when (ex is ArgumentException ||
                                       ex is PathTooLongException)
            {
                // 捕获路径中包含非法字符、过长等异常
                System.Diagnostics.Debug.WriteLine($"[FileHelper.GetFileDirectory] 获取文件目录时发生异常: {ex.Message}");
                return null;
            }
        }

        /// <summary>
        /// 创建指定路径的目录（包括任何必要的子目录）
        /// </summary>
        /// <remarks>
        /// 如果目录已存在，则不执行任何操作。
        /// </remarks>
        /// <param name="directoryPath">要创建的目录路径</param>
        /// <returns>如果目录已存在或创建成功，则为 true；如果 directoryPath 为 null 或空，或创建失败，则为 false</returns>
        public static bool CreateDirectory(string directoryPath)
        {
            // 参数验证
            if (string.IsNullOrEmpty(directoryPath))
            {
                return false;
            }

            // 先检查是否存在，避免不必要的异常（尽管CreateDirectory本身能处理存在的情况，但先检查更清晰）
            if (Directory.Exists(directoryPath))
            {
                return true;
            }

            try
            {
                Directory.CreateDirectory(directoryPath);
                return true;
            }
            catch (Exception ex) when (ex is UnauthorizedAccessException ||
                                      ex is PathTooLongException ||
                                      ex is IOException ||
                                      ex is NotSupportedException)
            {
                // 捕获可能因权限不足、路径过长、路径是文件、包含非法字符、磁盘已满等引起的异常
                System.Diagnostics.Debug.WriteLine($"[FileHelper.CreateDirectory] 创建目录时发生异常: {ex.Message}");
                return false;
            }
        }
    }
}
